package com.atguigu.netty.codec2;

import com.atguigu.netty.codec1.StudentPOJO;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

/**
 * @author: 叶子
 * @date: 2022/02/08 11:25
 * 自定义一个handler 需要继承netty规定好的某个HandlerAdapter
 * 此时自定义的handler才能称为handler
 * 用文档注释的是另外一种方式
 **/

/**
 * --public class NettyServerHandler extends ChannelInboundHandlerAdapter {
 */
public class NettyServerHandler extends SimpleChannelInboundHandler<MyDataInfo.MyMessage> {
//    读取数据事件（这里可以读取客户端发送的消息）

    /**
     * 1.ChannelHandlerContext ctx:上下文对象，含有管道pipeline，通道channel，地址
     * 2.Object msg: 客户端发送的数据，默认Object
     */
    /**
     * @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
     * //读取从客户端发送的StudentPOJO。Student
     * StudentPOJO.Student student = (StudentPOJO.Student) msg;
     * System.out.println("客户端发送的数据 id="+student.getId()+" 名字="+student.getName());
     * }
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, MyDataInfo.MyMessage msg) throws Exception {
        //根据dataType来显示不同的信息
        MyDataInfo.MyMessage.DataType dataType = msg.getDataType();
        if (dataType == MyDataInfo.MyMessage.DataType.StudentType) {
            MyDataInfo.Student student = msg.getStudent();
            System.out.println("学生id=" + student.getId() + " 学生姓名：" + student.getName());
        } else if (dataType == MyDataInfo.MyMessage.DataType.WorkerType) {
            MyDataInfo.Worker worker = msg.getWorker();
            System.out.println("worker姓名=" + worker.getName() + " worker年龄=" + worker.getAge());
        } else {
            System.out.println("传输的类型不正确");
        }
    }

    //    数据读取完毕
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        //writeAndFlush是write+flush，将数据写入缓存，并刷新
//      通常需要对这个发送的数据进行编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello,客户端...喵1", CharsetUtil.UTF_8));
    }
//    处理异常，一般是需要关闭通道

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }


}